import requests
from lxml import etree
import os
#导入线程池
from multiprocessing.dummy import Pool

root_dir = '校新闻'
if not os.path.isdir(root_dir):
    os.mkdir(root_dir)

header = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}

url = r'http://news.whpu.edu.cn/xw/xxyw.htm'
html = requests.get(url=url, headers=header)
html.encoding = "utf-8"
page_text = html.text
tree = etree.HTML(page_text)
pages_str = tree.xpath("//*[@id=\"fanye153388\"]/text()")[0]

page_nums = pages_str.split('/')[-1]
page_nums = int(page_nums)

#获取链接
all_url_list=[]

for i in range(page_nums, 180, -1):  #测试181-180
    if(i == page_nums):#特殊情况
        url = r'http://news.whpu.edu.cn/xw/xxyw.htm'
    else:
        url = rf'http://news.whpu.edu.cn/xw/xxyw/{i}.htm'
        #print(i)
    html = requests.get(url=url, headers=header)
    html.encoding = "utf-8"
    page_text = html.text
    tree = etree.HTML(page_text)
    urls = tree.xpath("//*[@id=\"content\"]/div[4]/ul//a/@href")

    for url_one in urls:
        url_one = url_one.replace('../..', 'http://news.whpu.edu.cn')
        url_one = url_one.replace('..', 'http://news.whpu.edu.cn')
        #print(url_one)
        all_url_list.append(url_one)
    #print(len(all_url_list))
##############################################
#2 爬取内容

#for one_url in all_url_list:
#改为函数
def get_data(one_url):
    header = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
    html = requests.get(url=one_url, headers=header)
    html.encoding = "utf-8"
    page_text = html.text

    tree = etree.HTML(page_text)
    title = tree.xpath("//*[@id=\"content\"]/div[2]/form/div/ul/li[2]/text()")[0]

    #具体目录
    one_news_dir = rf'{root_dir}\{title}'
    if not os.path.isdir(one_news_dir): #找else
        os.mkdir(one_news_dir)

        #1 图片
        pic_urls = tree.xpath("//*[@id=\"vsb_content_2\"]//img/@src")
        if len(pic_urls) > 0:
            pic_names = [] #图片名字
            for pic_url in pic_urls:
                pic_names.append(pic_url.split('/')[-1])

            #写入图片，包括合并图片地址
            #二个元素的遍历zip()
            #print(pic_names)
            for pic_name, pic_url in zip(pic_names, pic_urls):
                pic_url = 'http://news.whpu.edu.cn'+pic_url
                #写入图片
                try:
                    pic_content = requests.get(url=pic_url).content
                    # 注意具体目录f'{one_news_dir}\{pic_name}'
                    with open(rf'{one_news_dir}\{pic_name}', 'wb') as pp:
                        pp.write(pic_content)
                except:
                    print("图片网址无法打开")
        #2 内容
        texts = tree.xpath("//div[@id=\"vsb_content_2\"]//text()")
        #print(texts)
        #写入新闻内容操作,注意目录
        with open(rf'{one_news_dir}\{title}.txt', "w", encoding='utf-8') as fp:
            for text in texts:
                 text = text.strip() #strip()清除两边空字符
                 if(text): # 为空就不写
                     fp.write(text+"\n")

    else:
        print(title+'-->已存在，跳过')

pool = Pool(4)
'''
pool.map()函数。
需要传递两个参数，第一个参数就是需要引用的函数，
第二个参数是一个可迭代对象，如nums_list = [1, 2, 9]
它会把需要迭代的元素一个个的传入第一个参数我们的函数中。
因为我们的map会自动将数据作为参数传进去
result = pool.map(numsCheng, nums_list)
'''
pool.map(get_data, all_url_list) #函数，所有列表

#使用完成
pool.close() # pool.close告诉池不要接受任何新工作。
pool.join() # pool.join告诉池等待所有作业完成然后退出，有效地清理池。








